package main

/*
* Content: 普通指针、数组指针、结构体指针
* --------------------------------------------------
* Go pointer 详解和实战: https://juejin.cn/post/7072502044170387492
 */

import "fmt"

func MyPointer() {

	// 普通指针
	fmt.Println("--------------------普通指针--------------------")

	m := 10
	var p *int = &m // 取 地址
	fmt.Printf("m的地址p: %v\n", p)
	fmt.Printf("p指向的值m: %v\n", *p) // 取 指针 指向的 值

	// 数组指针
	fmt.Println("--------------------普通指针--------------------")

	arr := [3]int{1, 2, 3} // arr 是一个数组
	var pArr = &arr        // pArr 是指向数组的指针
	fmt.Printf("数组arr: %v\n", arr)
	fmt.Printf("数组指针pArr: %v\n", pArr)

	// 遍历数组指针
	fmt.Println("遍历数组指针")
	for p, q := range pArr { // 通过数组指针迭代数组的元素  p:index   q:value
		fmt.Printf("index: %v, value: %v\n", p, q)
	}

	// 结构体指针
	fmt.Println("--------------------结构体指针--------------------")

	// 定义结构体
	type student struct {
		name string
		age  int
	}

	// 创建实例 并 初始化
	var xqz student
	xqz.name = "谢清照"
	xqz.age = 18
	fmt.Printf("结构体xqz: %v\n", xqz)

	// 结构体指针
	var pStu *student
	pStu = &xqz
	fmt.Printf("pStu: %v\n", pStu)
	fmt.Printf("pStu.name: %v\n", pStu.name) // 语法糖: pStu.name = (*pStu).name

}
